package com.wyp.design.pattern.structural.proxy.staticproxy;

import com.wyp.design.pattern.structural.proxy.IOrderService;
import com.wyp.design.pattern.structural.proxy.Order;
import com.wyp.design.pattern.structural.proxy.OrderServiceImpl;
import com.wyp.design.pattern.structural.proxy.db.DataSourceContextHolder;

/**
 * 静态代理 只能代理一个接口
 * 为了保持行为的一致性,代理类和委托类通常会实现相同的接口，通过代理类，能有效的防止对委托类对象的直接访问，很好的隐藏和保护了委托类，
 * 静态代理：由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
 * 你会发现每个代理类只能为一个接口服务，这样程序开发中必然会产生许多的代理类
 *
 * @author: Oliver
 * @time: 2020/5/19/14:16
 */
public class OrderServiceStaticProxy {
    private IOrderService orderService;

    public int saveOrder(Order order) {
        //调用之前
        beforeMethod(order);
        orderService = new OrderServiceImpl();
        int num = orderService.saveOrder(order);
        afterMethod();
        return num;
    }

    private void beforeMethod(Order order) {
        int userId = order.getUserId();
        int dbRouter = userId % 2;
        System.out.println("静态代理分配到【db" + dbRouter + "】处理数据");

        //todo 设置dataSource;
        DataSourceContextHolder.setDBType("db" + String.valueOf(dbRouter));
        System.out.println("静态代理 before code");
    }

    private void afterMethod() {
        System.out.println("静态代理 after code");
    }
}
